﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace FySystem.Net.IOT.CommandSender
{
    /// <summary>
    /// 对应着一个设备
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class DeviceR<T>
    {
        /// <summary>
        /// 与设备的连接
        /// </summary>
        public Socket DeviceSocket { get; set; }

        /// <summary>
        /// 设备的采集器SN
        /// </summary>
        public string GatewaySN { get; set; }

        /// <summary>
        /// 设备的实时数据
        /// </summary>
        public T RealData { get; set; }

        /// <summary>
        /// 当前正在发送的指令
        /// </summary>
        public CmdInfo<T> CurrentCommand { get; internal set; }

        /// <summary>
        /// 最后放入队列的指令
        /// </summary>
        public CmdInfo<T> LastEnqueueCommand { get; internal set; }

        /// <summary>
        /// 当前发送的指令是否已经得到回复，仅当需要回复的指令才会在发送的时候设置为false
        /// </summary>
        internal bool SendComplete { get; set; } = true;

        /// <summary>
        /// 上次自动开始发送指令的时间，通常都一轮数据需要发送多条指令，这个是第一条指令的发送时间
        /// </summary>
        internal DateTime? LastSendTime { get; set; }

        /// <summary>
        /// 上一次发送指令的时间，用于判断两条指令之间的时间间隔，很多采集器必须要间隔一定时间后再发送，不然无法识别
        /// </summary>
        internal DateTime? LastCmdSendTime { get; set; }

        /// <summary>
        /// 将指定指令标记为已完成
        /// </summary>
        /// <param name="cmdInfo"></param>
        public void SetCurrentCommandComplete()
        {
            try
            {
                if (CurrentCommand == null)
                    return;

                SendComplete = true;
                CurrentCommand.IsComplete = true;
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}
